import axios , {AxiosError ,  type Method} from 'axios'
import router from '@/router'
import { useUserStore } from '@/stores'
import { showToast } from 'vant'

const instance = axios.create({
  //根地址 , 超时时间
  baseURL:'https://apifoxmock.com/m1/4840030-4495188-default',
  timeout:5000
})

instance.interceptors.request.use((config)=>{

  // 携带token
  const store =  useUserStore()

  // store.user!.token  不推荐
  if(store.user?.token && config.headers){
    config.headers['Authorization'] = `Bearer ${store.user?.token}`
  }
  return config
} , (err)=>Promise.reject(err))

// 响应拦截起
instance.interceptors.response.use((res)=>{
  // 后端约定  状态码200 以外,  code : 666 (success) 其他状态码都代表出了点问题 (业务逻辑决定的)
  if(res.data?.code !== 666){
    showToast(res.data?.message || '响应业务失败')
    return Promise.reject(res.data)
  }
  // 业务逻辑 成功的 , 能拿到正确的响应数据
  console.log('res.data:',res.data);
  return res.data

} , (err)=>{
  // 响应失败 (状态码401)
  if(err.response.status === 401){
      // 删除用户信息
      const store = useUserStore()
      store.delUser()

      router.push({
        path:'/login',
        query:{
          redirect:router.currentRoute.value.fullPath
        }
      })
  }
  // err
  console.log('err:',err);
  

  return Promise.reject(err)
})

//  {baseURL,}
export {instance}


// 暴露一个 请求方法 (指定参数位置)
// 请求工具

// 泛型
type Data<T> = {
  code:number
  message:string
  data:T
}

// 函数  T 
export const request = <T>(url:string , method:Method , sybmitData?:object)=>{
  return instance.request<T, Data<T>>({
    url,
    method,
    // get:sybmitData  /  params:sybmitData
    // G5kQ --> toLowerCase()   input --> toLowerCase()
    [method.toLowerCase() === 'get' ? 'params' : 'data']:sybmitData
  })
}